<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <script>
    // es 5 的构造函数 由于js没有提供类的概念  用函数来书写类
    // 构造函数的名字 首字母推荐大写
    // 构造函数的所有属性和方法 都存放到this上
    // 构造函数内部的this 指向当前实例化对象  new的过程就是实例化的过程
    function Car(name, color) {
      this.name = name;
      this.color = color;
      this.run = function () {
        alert(this.name + "跑")
      }
    }
    Car.prototype.run = function () { }
    // new  关键字做了什么
    //  1. 创建空对象；
    // var obj = {};
    // 2. 设置新对象的constructor属性为构造函数的名称，设置新对象的__proto__属性指向构造函数的prototype对象；
    // obj.__proto__ = Car.prototype;
    // 3. 使用新对象调用函数，函数中的this被指向新实例对象：
    // ClassA.call(obj);//{}.构造函数();
    // 4. 将初始化完毕的新对象地址，保存到等号左边的变量中

    var fengtian = new Car("丰田", "白色")
    // fengtian.run()
    var binli = new Car("宾利", "黑色")
    // binli.run()
    console.log(fengtian)
    console.log(binli)

    // 商品对象的构造函数
    function Product(name, price, sku, active_pirce) {
      this.name = name;
      this.price = price;
      this.sku = sku;
      this.active_pirce = active_pirce;
      this.clear = function () { }
      this.sell = function () { }
    }

    // 学生类
    function Student(name, age, sex) {
      this.name = name;
      this.age = age;
      this.sex = sex;
      this.say = function (sayval) {
        alert(this.name + "说" + sayval)
      }
    }
    // Student.prototype = {}  //原型式个空对象
    Student.prototype.school = "首航蓝天";
    Student.prototype.eat = function (eatval) {
      console.log(this.name + "吃" + eatval)
    }
    Student.prototype.run = function () {
      alert("学生跑")
    }

    // 每个函数都有一个原型属性prototype 可以用原型共享属性和方法
    var hanmeimei = new Student("韩梅梅", "15", "女")
    console.log(hanmeimei)
    hanmeimei.say("你好李雷")
    hanmeimei.eat("了俩串腰子")
    var jim = new Student("吉姆", "12", "男")

  </script>
</body>

</html>